package com.libre.workflow.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.libre.common.base.BaseController;
import com.libre.common.utils.ResultUtil;
import com.libre.common.vo.PageVo;
import com.libre.common.vo.Result;
import com.libre.workflow.service.MyTaskService;
import com.libre.workflow.vo.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;


/**
 * @author 庞留杰
 * @version V1.0
 * @description 流程任务
 * @date 2020/9/11 18:01
 **/
@Slf4j
@RestController
@RequestMapping("/workflow/task")
public class MyTaskController extends BaseController {

    @Autowired
    private MyTaskService taskService;

    /**
     * 功能描述: 查询申请（查询我发起的流程实例）【对应表：act_hi_procinst 历史的流程实例表】
     *
     * @param applyVo
     * @throws
     * @author: 庞留杰
     * @return: Result
     * @date: 2020/9/16 17:44
     */
    @GetMapping("/apply")
    public Result apply(@ModelAttribute PageVo pageVo, @ModelAttribute MyApplyVo applyVo) {
        Page page = taskService.apply(pageVo, applyVo);
        return new ResultUtil<>().setData(page);
    }

    /**
     * 功能描述: 根据用户ID或者用户组ID，查询该用户代办，查询该用户代办数量
     *
     * @param userId
     * @param groupIds
     * @throws
     * @author: 庞留杰
     * @return:
     * @date: 2021/4/15 11:23
     */
    @GetMapping("/count")
    public Result count(String userId, List<String> groupIds) {
        long count = taskService.count(userId, groupIds);
        return new ResultUtil<>().setData(count);
    }

    /**
     * 功能描述: 根据用户ID或者用户组ID，查询该用户待办
     *
     * @throws
     * @author: 庞留杰
     * @return:
     * @date: 2021/4/15 11:22
     */
    @GetMapping("/backlog")
    public Result backlog(@ModelAttribute PageVo pageVo, MyBacklogVo backlogVo) {
        Page page = taskService.backlog(pageVo, backlogVo);
        return new ResultUtil<>().setData(page);
    }

    /**
     * 功能描述: 查询已办任务【对应表：act_hi_taskinst】
     *
     * @param finishedVo
     * @throws
     * @author: 庞留杰
     * @return:
     * @date: 2020/9/14 9:14
     */
    @GetMapping(value = "/finished")
    public Result finished(@ModelAttribute PageVo pageVo, MyFinishedVo finishedVo) {
        Page page = taskService.finished(pageVo, finishedVo);
        return new ResultUtil<>().setData(page);
    }

    /**
     * 功能描述: 执行任务
     * 任务执行类型 claim：签收 unclaim 反签收 complete 完成 delegate 任务委派 resolve 任务签收完成 返回任务人 assignee 任务转办
     *
     * @throws
     * @author: 庞留杰
     * @return:
     * @date: 2021/4/15 11:03
     */
    @PostMapping(value = "executeTask")
    //任务执行类型 claim：签收 unclaim 反签收 complete 完成 delegate 任务委派 resolve 任务签收完成 返回任务人 assignee 任务转办
    public Result executeTask(@RequestBody MyExecuteVo executeVo) {
        Map<String, Object> result = taskService.executeTask(executeVo);
        return new ResultUtil<>().setData(result);
    }

//    /**
//     * 功能描述: 查询任务
//     * @author: 庞留杰
//     * @param taskListQuery
//     * @return:
//     * @exception
//     * @date: 2021/4/15 11:06
//     */
//    @ApiOperation(value = "查询任务", notes = "查询任务")
//    @GetMapping("/findTask")
//    public Result findTask(TaskListQuery taskListQuery) {
//        JSONArray arr = service.findTask(taskListQuery);
//        return new ResultUtil<>().setData(arr);
//    }
//
    /**
     * @description 添加备注信息
     * @param  commentAddQuery
     * {
     *        taskId: 任务ID
     *        processInstanceId:流程实例ID
     *        message: 批注信息
     *        userId: 用户ID
     * }
     * @author 庞留杰
     * @date 2020/9/14 9:34
     * @version V1.0
     **/
    @PostMapping(value = "/comment")
    public Result addComments(@RequestBody MyCommentVo commentVo) {
        taskService.addComments(commentVo);
        return new ResultUtil<>().setSuccessMsg("添加批注信息成功");
    }
//
//    /**
//     * @description 添加备注信息 （不需要taskId，不能再并行网关中使用）
//     * @param  commentAddQuery
//     * {
//     *        processInstanceId:流程实例ID
//     *        message: 批注信息
//     *        userId: 用户ID
//     * }
//     * @author 庞留杰
//     * @date 2020/9/14 9:34
//     * @version V2.0
//     **/
//    @PostMapping(value = "/v2/comment")
//    public Result addComments2(@RequestBody CommentAddQuery commentAddQuery) {
//        service.addComments2(commentAddQuery);
//        return new ResultUtil<>().setSuccessMsg("添加批注信息成功");
//    }
//
//
//    /**
//     * @description 查询备注信息
//     * @param processInstanceId： 流程实例ID
//     * @author 庞留杰
//     * @date 2020/9/14 9:37
//     * @version V1.0
//     **/
//    @GetMapping(value = "/findCommentList")
//    public Result findCommentList(String processInstanceId) {
//        List<Comment> comments = service.findCommentList(processInstanceId);
//        return new ResultUtil<>().setData(comments);
//    }
//
//    /**
//     * 功能描述: 获取所有可回退的节点
//     * @author: 庞留杰
//     * @param processInstanceId
//     * @return:
//     * @exception
//     * @date: 2020/9/14 9:37
//     */
//    @ApiOperation(value = "获取所有可回退的节点", notes = "获取所有可回退的节点", produces = "application/json")
//    @GetMapping(value = "/getFallbackNode/{processInstanceId}")
//    public Result getFallbackNode(@PathVariable(value = "processInstanceId") String processInstanceId) {
//        Map<String, Object> map = service.getFallbackNode(processInstanceId);
//        return new ResultUtil<>().setData(map);
//    }
//
//    /**
//     * 功能描述: 获取所有可回退的节点
//     *          规则：
//     *          1.从历史获取所有审批过的节点信息
//     *          2.通过开始时间排序，去除历史中重复的节点
//     * @author: 庞留杰
//     * @param   processInstanceId
//     * @return:
//     * @exception
//     * @date: 2021/1/21 15:10
//     */
//    @ApiOperation(value = "获取所有可回退的节点", notes = "获取所有可回退的节点", produces = "application/json")
//    @GetMapping(value = "/v2/getFallbackNode/{processInstanceId}")
//    public Result getFallbackNode2(@PathVariable(value = "processInstanceId") String processInstanceId) {
//        Map<String, Object> map = service.getFallbackNode2(processInstanceId);
//        return new ResultUtil<>().setData(map);
//    }
//
//    /**
//     * 功能描述: 获取所有可回退的节点
//     *          规则：
//     *              从历史获取所有审批过的节点信息
//     *              带分页
//     * @author: 庞留杰
//     * @param   processInstanceId
//     * @return:
//     * @exception
//     * @date: 2021/1/21 15:10
//     */
//    @ApiOperation(value = "获取所有可回退的节点", notes = "获取所有可回退的节点", produces = "application/json")
//    @GetMapping(value = "/v3/getFallbackNode/{processInstanceId}")
//    public Result getFallbackNode3(@PathVariable(value = "processInstanceId") String processInstanceId, @ModelAttribute PageVo pageVo) {
//        Map<String, Object> map = service.getFallbackNode3(processInstanceId, pageVo);
//        return new ResultUtil<>().setData(map);
//    }
//
//    /**
//     * 功能描述: 任务撤回【注意：当前与目标定义Key为设计模板时任务对应的ID(通常格式：sid-xxxxxxxxxxxxxxxxx),而非数据主键ID】
//     * @author: 庞留杰
//     * @param taskFallbackQuery
//     *         processInstanceId ：流程实例ID
//     *         currentTaskKey ：当前任务定义Key
//     *         targetTaskKey ：目标任务定义Key
//     * @return:
//     * @exception
//     * @date: 2021/1/21 11:18
//     */
//    @ApiOperation(value = "任务撤回", notes = "任务撤回", produces = "application/json")
//    @PostMapping("/withdraw")
//    public Result withdraw(@RequestBody TaskFallbackQuery taskFallbackQuery) {
//        service.withdraw(taskFallbackQuery);
//        return new ResultUtil<>().setSuccessMsg("任务撤回成功");
//    }
//
//    /**
//     * 功能描述: 退回上一步，注意只能回退一步【例： 当前在“第三步”：
//     *                              调用一次，回退到“第二步”，
//     *                              再次调用，回退到“第三步”，
//     *                              再次调用，回退到“第二步”，
//     *                                以此类推。。。。
//     *           】
//     * @author: 庞留杰
//     * @param processInstanceId：流程实例ID
//     * @return:
//     * @exception
//     * @date: 2021/1/21 11:20
//     */
//    @PostMapping("/rollback")
//    public Result rollback(@RequestBody String processInstanceId) {
//        Map<String, String> map = service.rollback(processInstanceId);
//        return new ResultUtil<>().setData(map);
//    }
//

    /**
     * 功能描述: 审批历史记录, 查看任务执行的详情【对应表：act_hi_actinst历史节点表】
     *
     * @param recordsVo
     * @throws
     * @author: 庞留杰
     * @return:
     * @date: 2020/9/16 19:38
     */
    @GetMapping(value = "/records")
    public Result records(@ModelAttribute PageVo pageVo, @ModelAttribute MyRecordsVo recordsVo) {
        Page page = taskService.records(pageVo, recordsVo);
        return new ResultUtil<>().setData(page);
    }
//
//
//    @ApiOperation(value = "通过流程实例id获取taskId", notes = "通过流程实例id获取taskId")
//    @GetMapping("/getTaskIdByProcessInstanceId")
//    public Result getTaskIdByProcessInstanceId(@RequestParam(value = "processInstanceId")String processInstanceId) {
//        String taskId = service.getTaskIdByProcessInstanceId(processInstanceId);
//        return new ResultUtil<>().setData(taskId);
//    }

}
